iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0

創建型:工廠模式

工廠模式顧名就是創造東西,可能是物件、類別、甚至方法。

以下這些都是工廠模式:

  • 用函式、方法來做程式的圖形介面
  • 來創造用戶的類別
  • 靜態方法呼叫類別的建構式

** 使用情境 **

  • 將產品[創造的流程]和[產品使用]分割出來,讓產品創造流程更靈活有彈性。
  • 如果你想讓其他用戶使用你的套件,並能延伸應用
  • 使用者可以繼承然後拓展原本的功能
  • 當你想要重複利用龐大的程式碼時

TS 案例

這邊以椅子工廠為例,我們要建造大椅子或小椅子,椅子有寬有高有深。

//我們倒過來看,客戶只會知道有一個工廠可以製作椅子,他要小椅子
const CHAIR = ChairFactory.getChair('SmallChair')
//也可以製作大椅子
const CHAIR = ChairFactory.getChair('BigChair')

//來看看工廠裡面有啥
//基本的廠房
//還有一種是會把if判斷式拉出來做成新的工廠
//class SmallChairFactory extends ChairFactory
class ChairFactory {
    //會回傳有ChairTemplate類型的產品,成品會有三種
    static getChair(chair: string): 會回傳ChairTemplate的類型 {
        if (chair == 'BigChair') {
            return new BigChair()
        } else if (chair == 'MediumChair') {
            return new MediumChair()
        } else {
            return new SmallChair()
        }
    }
}

//來看看ChairTemplate有什麼
//裡面有高寬深類別,還有一個getDimensions的功能
interface ChairTemplate {
    height: number
    width: number
    depth: number
    getDimensions(): dimension
}

//getDimension回傳的類型就會有高寬深
type dimension = {
    height: number
    width: number
    depth: number
}

// ChairTemplate 只是一個架構,Chair的類別才是我們的基本
// 覆蓋interface的方法和Property
export default class Chair implements ChairTemplate {
    height = 0
    width = 0
    depth = 0

    getDimensions(): dimension {
        return {
            width: this.width,
            depth: this.depth,
            height: this.height,
        }
    }
}

//這邊就是我們產品實例啦
export default class SmallChair extends Chair {
    constructor() {
        //呼叫super()繼承Chair
        super()
        this.height = 40
        this.width = 40
        this.depth = 40
    }
}

export default class BigChair extends Chair {
    constructor() {
        super()
        this.height = 80
        this.width = 80
        this.depth = 80
    }
}

應用到的原則

  1. 單一職責Single responsibility principle (SRP)

    1. 我們的ChairFactory只負責生產
  2. 開關原則 Open-Close principle (OCP)

    1. 你可以添加新的類別而不會影響到原本的類別
    2. 新增一種產品時,只要增加相應的具體產品子類和工廠子類就好


環遊非洲第22天-不覺得非洲國家國界很整齊嗎?

看一下非洲國家的地圖,有沒有覺得有些國家的國界特別筆直?

這是因為非洲國家的國界大多是殖民時代各國列強劃分的,
他們不在乎各族群部落的分界,逕自根據經緯度、天然界線劃分,
導致一些明明是同一個部落的民族,卻被分在不同國家,流離失所。
而這樣人為國界造成的問題遺留至今,
非洲許多國家,至今仍有許多民族糾紛、邊界領土衝突。

Why Africa's Borders are a Mess
非洲國界線背後的罪惡:列強肆意瓜分,埋下了非洲貧窮戰爭的禍根

https://ithelp.ithome.com.tw/upload/images/20221007/201402473Wy4VxcgdQ.png

圖片來源



參考

Design Patterns

Factory Design Pattern in TS

Java设计模式(二) 工厂方法模式


上一篇
菜鳥初探設計模式-D21
下一篇
抽象工廠模式-用TS挑戰設計模式-D23
系列文
分手前端菜雞之旅@非洲30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言